package com.im;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

// 登录窗口
@SuppressWarnings("serial")
public class LogonWindow extends JDialog implements ActionListener {
    // 用户单击的按钮
    public enum ClickedButton {
        CANCEL, // "取消"按钮
        OK      // "确定"按钮
    }

    private String mPassword;               // 密码
    private String mUsername;               // 用户名
    private final JTextField mEditPassword; // "密码"编辑框
    private final JTextField mEditUsername; // "用户名"编辑框
    private final JButton mButtonCancel;    // "取消"按钮
    private final JButton mButtonOK;        // "确定"按钮
    private ClickedButton mClickedButton;   // 用户单击的按钮

    /**
     * 构造方法。
     */
    public LogonWindow() {
        /***** 设置自身属性 *****/
        // 设置窗口标题
        super.setTitle(Const.getString("IDS_LOGON"));

        // 设置窗口尺寸不能改变
        super.setResizable(false);

        // 设置窗口尺寸
        super.setSize(Const.LOGON_WINDOW_WIDTH, Const.LOGON_WINDOW_HEIGHT);

        // 设置窗口居中
        super.setLocationRelativeTo(null);

        // 设置窗口布局
        super.setLayout(null);

        // 设置显示方式为模态
        super.setModal(true);

        /***** 创建控件 *****/
        // "用户名"标签
        final JLabel labelUsername = new JLabel(Const.getString("IDS_USERNAME"));
        labelUsername.setBounds(Const.LOGON_WINDOW_LABEL_USERNAME_BOUNDS);
        super.add(labelUsername);

        // "用户名"编辑框
        mEditUsername = new JTextField(Const.LOGON_WINDOW_EDIT_WIDTH);
        mEditUsername.setBounds(Const.LOGON_WINDOW_EDIT_USERNAME_BOUNDS);
        mEditUsername.setDocument(new LimitDocument(Const.MAX_USERNAME_LEN));   // 设置最大用户名长度
        super.add(mEditUsername);

        // "密码"标签
        final JLabel labelPassword = new JLabel(Const.getString("IDS_PASSWORD"));
        labelPassword.setBounds(Const.LOGON_WINDOW_LABEL_PASSOWRD_BOUNDS);
        super.add(labelPassword);

        // "密码"编辑框
        mEditPassword = new JPasswordField(Const.LOGON_WINDOW_EDIT_WIDTH);
        mEditPassword.setBounds(Const.LOGON_WINDOW_EDIT_PASSWORD_BOUNDS);
        mEditPassword.setDocument(new LimitDocument(Const.MAX_PASSWORD_LEN));   // 设置最大密码长度
        super.add(mEditPassword);

        // "确定"按钮
        mButtonOK = new JButton(Const.getString("IDS_LOGON"));
        mButtonOK.setBounds(Const.LOGON_WINDOW_BUTTON_OK_BOUNDS);
        mButtonOK.addActionListener(this);
        super.add(mButtonOK);

        // "取消"按钮
        mButtonCancel = new JButton(Const.getString("IDS_CANCEL"));
        mButtonCancel.setBounds(Const.LOGON_WINDOW_BUTTON_CANCEL_BOUNDS);
        mButtonCancel.addActionListener(this);
        super.add(mButtonCancel);
        
        // 初始化成员
        mClickedButton = ClickedButton.CANCEL;
    }

    /**
     * 按钮的单击响应方法。
     * @param e 事件相关信息
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == mButtonOK) {
            this.onOK();
        } else {
            this.onCancel();
        }
    }
    
    /**
     * 获取用户单击的按钮。
     * @return 用户单击的按钮
     */
    public ClickedButton getClickedButton() {
        return mClickedButton;
    }

    /**
     * 获取密码。
     * @return 密码
     */
    public String getPassword() {
        return mPassword;
    }

    /**
     * 获取用户名。
     * @return 用户名
     */
    public String getUsername() {
        return mUsername;
    }

    /**
     * "取消"按钮的单击响应方法。
     */
    private void onCancel() {
        // 关闭窗口
        mClickedButton = ClickedButton.CANCEL;
        super.dispose();
    }

    /**
     * "确定"按钮的单击响应方法。
     */
    private void onOK() {
        // 检查用户名是否为空
        final String username = mEditUsername.getText();
        if (username.isEmpty()) {
            JOptionPane.showMessageDialog(this, Const.getString("IDS_USERNAME_EMPTY"), " ", JOptionPane.ERROR_MESSAGE);
            mEditUsername.requestFocus();
            return;
        }

        // 检查密码是否为空
        final String password = mEditPassword.getText();
        if (password.isEmpty()) {
            JOptionPane.showMessageDialog(this, Const.getString("IDS_PASSWORD_EMPTY"), " ", JOptionPane.ERROR_MESSAGE);
            mEditPassword.requestFocus();
            return;
        }

        // 保存用户名、密码
        mUsername = username;
        mPassword = password;

        // 关闭窗口
        mClickedButton = ClickedButton.OK;
        super.dispose();
    }
}
